package com.cotasul.persistencia;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.cotasul.bean.ProdutoBean;
import com.cotasul.persistencia.config.GerenciadorConexao;
import com.cotasul.persistencia.config.SQLConfiguracao;
import com.cotasul.persistencia.enums.EnumCondicao;
import com.cotasul.persistencia.interfaces.IProdutoDao;

public class ProdutoDao<P extends ProdutoBean> extends DaoGenerico<P> implements
		IProdutoDao<P> {

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void alterar(P p) throws Exception {
		try {
			query = SQLConfiguracao.getInstance().getValor("altera_produto");
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getDescricao());
			ps.setString(2, p.getUnidadeMedida());
			ps.setString(3, p.getMarca());
			ps.setLong(4, p.getCodigo());
			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;
		}

	}

	@Override
	public Map<String, Long> salvar(P p) throws Exception {

		long codProd = 0;
		long codComp = 0;

		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_max_produto");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				codProd = rs.getLong("MAXCOD");
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_comprador_usuario");
				ps = conn.prepareStatement(query);
				ps.setLong(1, p.getComprador().getUsuario().getCodigo());
				rs = ps.executeQuery();
				if (rs.next()) {
					codComp = rs.getLong("IDCOMP");
					query = SQLConfiguracao.getInstance().getValor(
							"insere_produto");
					ps = conn.prepareStatement(query);
					ps.setLong(1, codProd);
					ps.setString(2, p.getDescricao());
					ps.setString(3, p.getUnidadeMedida());
					ps.setLong(4, codComp);
					ps.setBytes(5, p.getImagemProd());
					ps.setString(6, p.getMarca());
					ps.execute();
					conn.commit();
				}

			}
		} catch (Exception e) {
			conn.rollback();
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<P> consultaProdutos(String codigo, String descricao, Long idUser)
			throws Exception {

		List<P> listaProdutos = new ArrayList<P>();
		ProdutoBean p;
		conn = GerenciadorConexao.getConexao();
		if ((codigo != null) || (descricao != null)) {
			query = SQLConfiguracao.getInstance().getValor("consulta_produtos");
			if (idUser != null && idUser != 0) {
				query += " AND u.IDUSER = " + idUser;
			}
			if (codigo != null && !"".equals(codigo.trim())) {
				query += " AND IDPROD = " + codigo;
			}
			if (descricao != null && !"".equals(descricao.trim())) {
				query += " AND DESCRICAO LIKE '" + descricao + "%%'";
			}

			ps = conn.prepareStatement(query);
//			ps.setLong(1, idUser);
			rs = ps.executeQuery();
			while (rs.next()) {
				p = new ProdutoBean();
				p.setCodigo(rs.getLong("IDPROD"));
				p.setDescricao(rs.getString("DESCRICAO"));
				p.setUnidadeMedida(rs.getString("UNIMEDIDA"));
				p.setImagemProd(rs.getBytes("IMAGEMPROD"));
				p.setMarca(rs.getString("MARCA_PROD"));
				listaProdutos.add((P) p);
			}
		}
		return listaProdutos;
	}

	@Override
	public void exluir(P p) throws Exception {
		conn = GerenciadorConexao.getConexao();
		query = SQLConfiguracao.getInstance().getValor("exclui_produto");
		ps = conn.prepareStatement(query);
		ps.setLong(1, p.getCodigo());
		ps.execute();
		conn.commit();
		ps.close();
	}

	@Override
	public void preSalvar(P p) {
		// TODO Auto-generated method stub

	}

	@Override
	public List<P> filtraProdutos(P p) throws Exception {

		return null;
	}

}
